package baiqitun.stupro.security.service;

import baiqitun.stupro.common.model.TreeModel;
import baiqitun.stupro.common.service.EntityEnabledChecker;
import baiqitun.stupro.common.service.MyService;
import baiqitun.stupro.common.service.TreeNodeService;
import baiqitun.stupro.security.entity.SysPermission;
import com.baomidou.mybatisplus.extension.service.IService;
import sun.reflect.generics.tree.Tree;

import java.util.List;

/**
 * <p>
 * 许可表 服务类
 * 许可分为UI许可与非UI许可
 * UI许可：可在界面展示的菜单、按钮或链接等等
 * 非UI许可：普通的URI请求
 * </p>
 *
 * @author kedaji
 * @since 2020-03-25
 */
public interface SysPermissionService extends TreeNodeService<SysPermission>, EntityEnabledChecker<SysPermission> {

    /**
     * 保存一条根许可
     * @param permission 许可
     */
    void saveRoot(SysPermission permission);

    /**
     * 保存一条子许可
     * @param permission 许可
     */
    void saveChild(SysPermission permission);

    /**
     * 获取角色的顶级许可
     * @param roleCode 角色代码
     * @param group 分组
     * @return 许可列表
     */
    List<SysPermission> listRootPermissionByRoleCode(String roleCode,String group);

    /**
     * 删除一条许可，删除此许可后，其子许可无法被正常搜索到，其到了级联删除的作用
     * @param id 许可id
     * @param updateBy 修改人用户名
     * @return 操作是否成功
     */
    @Override
    boolean removeById(String id, String updateBy);

    /**
     * 获取许可信息
     * @param uri 请求路径
     * @param method 请求方式
     * @return 许可信息
     */
    SysPermission getPermission(String uri, String method);

    /**
     * 建立角色与许可之间的联系
     * @param roleId 角色Id
     * @param permissionId 许可Id
     * @param createBy 创建人用户名
     */
    void relevance(String roleId, String permissionId, String createBy);

    /**
     * 获取角色的许可
     * @param roleId 角色id
     * @return 许可列表
     */
    List<SysPermission> listByRoleId(String roleId);

    /**
     * 建立角色与许可之间的联系
     * @param roleCode 角色代码
     * @param permissionId 许可Id
     * @param createBy 创建人用户名
     */
    void relevanceByRoleCode(String roleCode, String permissionId, String createBy);

    /**
     * 角色是否持有指定许可
     * @param roleId 角色id
     * @param permissionId 许可id
     * @return 是/否
     */
    boolean hasRelation(String roleId, String permissionId);

    /**
     * 角色是否持有指定许可
     * @param roleCode 角色代码
     * @param permissionId 许可id
     * @return 是/否
     */
    boolean hasRelationByRoleCode(String roleCode, String permissionId);
}
